package dragon.social.core.QQ;

import dragon.social.core.ConstantProperties;
import dragon.social.core.QQ.api.QQApi;
import dragon.social.core.QQ.api.QQApiImpl;
import dragon.social.core.rewrite.TextOAuth2Template;
import org.springframework.social.oauth2.AbstractOAuth2ServiceProvider;

/**
 * 此类会对应多个QQ APP,一个APP一个实例，由于一个user会对应一个QQApi，并且QQApi需要appId，所以要在这里保存appId传给QQApi
 */
public class QQServiceProvider extends AbstractOAuth2ServiceProvider<QQApi> {

    private String appId;
    public QQServiceProvider(ConstantProperties.SPEnum spEnum) {
        //父类要求传入一个OAuth2Operations接口，而这个接口的默认实现类就是OAuth2Template
        /**
         * OAuth2Template的四个构造函数
         *   * @param clientId the client ID
         * 	 * @param clientSecret the client secret
         * 	 * @param authorizeUrl the base URL to redirect to when doing authorization code or implicit grant authorization
         * 	 * @param accessTokenUrl the URL at which an authorization code, refresh token, or user credentials may be exchanged for an access token.
         */
        super(new TextOAuth2Template(spEnum.getAppId(),spEnum.getAppSecret(), ConstantProperties.QQ_AUTHORIZE_URL,ConstantProperties.QQ_ACCESS_TOKEN_URL,TextOAuth2Template.TOKEN_RESPONSE_TYPE_QQ));
        this.appId = spEnum.getAppId();
        /*
        为什么不用原来自带的OAuth2Template？因为原来自带的template，在构造时没有添加String的MessageConverter，因此服务提供商返回text类型的数据时，没法解析
        刚好QQ就是返回text类型，而不是json类型。所以要重写
         */
        //super(new OAuth2Template(QQ_APP_ID,QQ_APP_KEY,QQ_AUTHORIZE_URL,QQ_ACCESS_TOKEN_URL));
    }

    /**
     * 返回QQ的api操作实现类，这里应该改一下，不应该new的。因为当平台需要登录后，需要调用某个user的QQ接口时，没法找回来
     * 所以应该是有个map去保存它的。并且这个map要记录过期时间
     * @param accessToken
     * @return
     */
    @Override
    public QQApi getApi(String accessToken) {
        return new QQApiImpl(accessToken,appId);
    }
}
